Add Two Numbers
ループの中で2つのLinked Listを同時にみていき、それぞれの値を足した結果を新しいLinked Listの値として使う。足した結果、桁が上がったらその値をcarryとして、次のループ回の足し算に流用する
code:go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
var currentL1, currentL2, firstNode, prevNode *ListNode
currentL1 = l1
currentL2 = l2
var carry, i int
for {
if shouldFinish(currentL1, currentL2, carry) {
break
}
var l1Val, l2Val int
if currentL1 != nil {
l1Val = currentL1.Val
}
if currentL2 != nil {
l2Val = currentL2.Val
}
sum := l1Val + l2Val + carry
carry = 0
var newVal int
// 桁が変わるならキャリーと値を分割
if sum > 9 {
newVal = sum % 10
carry = (sum - newVal) / 10
} else {
newVal = sum
}
newNode := createNode(newVal, nil)
if i == 0 {
firstNode = newNode
} else {
prevNode.Next = newNode
}
if currentL1 != nil {
currentL1 = currentL1.Next
}
if currentL2 != nil {
currentL2 = currentL2.Next
}
prevNode = newNode
i++
}
return firstNode
}
func shouldFinish(l1, l2 *ListNode, carry int) bool {
return l1 == nil && l2 == nil && carry == 0
}
func createNode(val int, nextNode *ListNode) *ListNode {
return &ListNode{
Val: val,
Next: nextNode,
}
}